package br.com.fatecjp.pooai.gerenciador.taxi.mobile.client;

import jade.core.Agent;
import jade.core.behaviours.Behaviour;
import jade.domain.DFService;
import jade.domain.FIPAException;
import jade.domain.FIPAAgentManagement.DFAgentDescription;
import jade.domain.FIPAAgentManagement.ServiceDescription;
import jade.lang.acl.ACLMessage;
import br.com.fatecjp.pooai.gerenciador.taxi.ambiente.Posicao;
import br.com.fatecjp.pooai.gerenciador.taxi.message.ConteudoMensagemAgente;
import br.com.fatecjp.pooai.gerenciador.taxi.message.TipoMensagemAgente;
import br.com.fatecjp.pooai.gerenciador.taxi.message.parser.RequisicaoSolicitacaoTaxiParser;
import br.com.fatecjp.pooai.gerenciador.taxi.service.NomeServico;

public class AgenteCliente extends Agent {

	protected void setup() {
		this.addBehaviour(new RequisitarTaxiBehaviour(this));
	}

	private class RequisitarTaxiBehaviour extends Behaviour {

		private boolean requisitouTaxi;
		private RequisicaoSolicitacaoTaxiParser requisicaoSolTaxiParser;

		public RequisitarTaxiBehaviour(Agent agent) {
			super(agent);
			this.requisicaoSolTaxiParser = new RequisicaoSolicitacaoTaxiParser();
		}

		public void action() {

			ServiceDescription descritorServico = new ServiceDescription();
			descritorServico.setName(NomeServico.SOLICITACAO_TAXI.toString());

			DFAgentDescription descritorAgente = new DFAgentDescription();
			descritorAgente.addServices(descritorServico);

			DFAgentDescription[] resultadoBusca = null;
			try {
				resultadoBusca = DFService.search(myAgent,
						descritorAgente);
			} catch (FIPAException e) {
				throw new RuntimeException(e.getMessage());
			}

			if (resultadoBusca != null && resultadoBusca.length > 0) {

				descritorAgente = resultadoBusca[0];

				ACLMessage requisicaoSolTaxi = new ACLMessage(
						ACLMessage.REQUEST);
				requisicaoSolTaxi.setSender(myAgent.getAID());
				requisicaoSolTaxi.addReceiver(descritorAgente.getName());

				ConteudoMensagemAgente conteudoRequisicao = new ConteudoMensagemAgente(
						TipoMensagemAgente.REQUISICAO_TAXI.getCode());
				
				Posicao origem = new Posicao(Integer.valueOf(
						myAgent.getArguments()[0].toString()).intValue(),
						Integer.valueOf(myAgent.getArguments()[1].toString())
								.intValue());
				
				Posicao destino = new Posicao(Integer.valueOf(
						myAgent.getArguments()[2].toString()).intValue(),
						Integer.valueOf(myAgent.getArguments()[3].toString())
								.intValue());

				conteudoRequisicao
						.setConteudo(new Object[] { origem, destino });

				requisicaoSolTaxi.setContent(this.requisicaoSolTaxiParser
						.toString(conteudoRequisicao));

				myAgent.send(requisicaoSolTaxi);
				this.requisitouTaxi = true;

			}

		}

		public boolean done() {
			return this.requisitouTaxi;
		}

	}

}
